<!doctype html>
<html lang="en-us">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.59.1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Java 反射 | 林贤钦</title>
    <meta property="og:title" content="Java 反射 - 林贤钦">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2020-04-21T12:53:07&#43;08:00">
        
        
    <meta property="article:modified_time" content="2020-04-21T12:53:07&#43;08:00">
        
    <meta name="Keywords" content="java,博客,项目管理,软件架构,公众号,小程序">
    <meta name="description" content="Java 反射">
        
    <meta name="author" content="林贤钦">
    <meta property="og:url" content="http://linxianqin.gitee.io/post/java-%E5%8F%8D%E5%B0%84/">
    <link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/css/normalize.css">
    
        <link rel="stylesheet" href="/css/prism.css">
    
    <link rel="stylesheet" href="/css/style.css">
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
	<div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="http://linxianqin.gitee.io">
                        林贤钦
                    </a>
                
                <p class="description">专注于Java、微信小程序、移动互联网、项目管理、软件架构</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    <a class="current" href="http://linxianqin.gitee.io">首页</a>
                    
                    <a  href="http://linxianqin.gitee.io/archives/" title="归档">归档</a>
                    
                    <a  href="http://linxianqin.gitee.io/about/" title="关于">关于</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
        
        
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">Java 反射</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2020年4月21日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="http://linxianqin.gitee.io/categories/java">java</a></span>
                            
                        </div>
                        
                        
                        <div class="post-meta">
                            <span id="busuanzi_container_page_pv">|<span id="busuanzi_value_page_pv"></span><span> 阅读</span></span>
                        </div>
                        
                        
                        <div class="post-content">
							<nav id="TableOfContents">
<ul>
<li><a href="#java-反射机制">Java 反射机制</a>
<ul>
<li><a href="#基本概念">基本概念</a>
<ul>
<li><a href="#下面举一些例子-来详细说一下反射">下面举一些例子，来详细说一下反射。</a>
<ul>
<li><a href="#1-通过java反射机制得到类的包名和类名">1、通过Java反射机制得到类的包名和类名</a></li>
<li><a href="#2-验证所有的类都是class类的实例对象">2、验证所有的类都是Class类的实例对象</a></li>
<li><a href="#3-通过java反射机制-用class-创建类对象-这也就是反射存在的意义所在">3、通过Java反射机制，用Class 创建类对象[这也就是反射存在的意义所在]</a></li>
<li><a href="#4-通过java反射机制得到一个类的构造函数-并实现创建带参实例对象">4、通过Java反射机制得到一个类的构造函数，并实现创建带参实例对象</a></li>
<li><a href="#5-通过java反射机制操作成员变量-set-和-get">5、通过Java反射机制操作成员变量, set 和 get</a></li>
<li><a href="#6-通过java反射机制得到类的一些属性-继承的接口-父类-函数信息-成员信息-类型等">6、通过Java反射机制得到类的一些属性： 继承的接口，父类，函数信息，成员信息，类型等</a></li>
<li><a href="#7-通过java反射机制调用类方法">7、通过Java反射机制调用类方法</a></li>
</ul></li>
</ul></li>
<li><a href="#反射机制的相关类">反射机制的相关类</a></li>
<li><a href="#class类">Class类</a></li>
</ul></li>
<li><a href="#field类">Field类</a></li>
<li><a href="#method类">Method类</a></li>
<li><a href="#constructor类">Constructor类</a>
<ul>
<li><a href="#参考文献">参考文献</a></li>
</ul></li>
</ul>
</nav>
                            

<h1 id="java-反射机制">Java 反射机制</h1>

<h2 id="基本概念">基本概念</h2>

<p>​   在java运行时环境中，对于任意一个类，能否知道这个类有哪些属性和方法？对于任意一个对象，能否调用它的任意一个方法？</p>

<p>答案是肯定的</p>

<p>这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的<strong>反射（Reflection）机制</strong>。</p>

<p><strong>反射也称作框架设计的灵魂，简单来说，反射将类的各个部分封装为其他对象。使用反射，可以在程序运行过程中，操作这些对象，也可以解耦，提高程序的可扩展性</strong></p>

<p>那么，既然反射是如何操作的？</p>

<p>待我一步一步慢慢道来，首先，先不管三七二十一，在idea敲上这些代码</p>

<pre><code class="language-java">public class DumpMethods {
    public static void main(String[] args) throws Exception{
        //获得字符串所标识的class对象
        //在此处传入字符串指定类名，所以参数获取可以是一个运行期的行为，可以用args[0]
        Class&lt;?&gt; clazz=Class.forName(&quot;java.lang.String&quot;);

        //返回class对象所对应的类或接口，所声明的所有方法和数组(包括私有方法)
        Method[] methods = clazz.getDeclaredMethods();

        //遍历输出所有方法声明
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}
</code></pre>

<p>然后运行一下main方法，然后你就能看到巴拉巴拉一大堆String类下的方法了</p>

<p><strong>然后我们思考一下，我们如何获取String 类下的方法的？</strong>这里也没有用传统的new一个对象，然后对象.方法</p>

<p>在上面的代码中，有三步，</p>

<p>第一步，通过Class.forName(&ldquo;全类名&rdquo;)获取Class对象，</p>

<p>第二步，通过类.getDeclaredMethods()获取该类声明的所有方法和数组，连私有方法都能拿得到，简直隐私都没了</p>

<p>第三步，通过一个遍历，将每个方法的声明都输出</p>

<p>结果如下（只写前5个，太多了，就不一一列举）</p>

<pre><code class="language-java">public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
</code></pre>

<p><strong>再举个例子，我们模拟传统new一个对象，和用反射获取的对象和方法，来调用方法</strong></p>

<pre><code>public class InvokeTester {
    public int add(int param1,int param2){
        return param1+param2;
    }
    public String echo(String message){
        return &quot;hello,&quot;+message;
    }

    public static void main(String[] args) throws Exception{
        //以前常规执行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1,2));
        System.out.println(tester.echo(&quot;linxianqin&quot;));
        System.out.println(&quot;tester----&gt;&quot;+tester);
        System.out.println(&quot;---------------------------------------------&quot;);
        
        //通过反射机制
        //第一步，获取Class对象
        // 前面用Class.forName()方法获取
        // 这里用第二种方法，类名.class
        Class&lt;?&gt; clazz = InvokeTester.class;

        //生成新的对象，用newInstance()方法
        Object invokeTester = clazz.newInstance();
        System.out.println(invokeTester instanceof InvokeTester);// 输出true

        //通过反射调用方法
        //首先需要获得与该方法对应的Method对象
        Method addMethod  = clazz.getMethod(&quot;add&quot;, int.class, int.class);
        System.out.println(&quot;addMethod---------&gt;&quot;+addMethod);
        // 第一个参数是方法名，第二个参数是这个方法所需要的参数的Class对象的数组
//        Method addMethod = clazz.getMethod(&quot;add&quot;, new Class[] { int.class,
//                int.class });
        //调用目标方法
        Object result  = addMethod.invoke(invokeTester, new Object[]{1, 2});
        System.out.println(result);

        //调用第二个方法
        Method echoMethod = clazz.getMethod(&quot;echo&quot;, String.class);
        Object invoke = echoMethod .invoke(invokeTester, new Object[]{&quot;linxianqin&quot;});
        System.out.println(invoke);
    }
}
</code></pre>

<p>通过上面的例子，我们也大概知道了什么是反射，如果还不懂，下面举更详细的例子，其实反射机制就是可以将一个类，类的成员，方法，继承与哪个类，实现了哪个接口，当作一个个对象来操作，在反射面前，没有所谓的私有，当然，也有特殊情况，被设置权限了。</p>

<h3 id="下面举一些例子-来详细说一下反射">下面举一些例子，来详细说一下反射。</h3>

<p>首先，先整一个Person，然后我们来玩它。</p>

<pre><code>package com.linxianqin.reflection;

/**
 * 功能描述：被反射玩的对象
 *
 * @author 林贤钦
 * @version 1.00
 * @Date 2020/4/21
 */
public class Person {
    private int age;
    private String name;
    public Person(){

    }
    public Person(int age, String name){
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
</code></pre>

<h4 id="1-通过java反射机制得到类的包名和类名">1、通过Java反射机制得到类的包名和类名</h4>

<pre><code class="language-java">Person person = new Person();
System.out.println(&quot;包名：&quot;+person.getClass().getPackage().getName());
System.out.println(&quot;完整类名：&quot;+person.getClass().getName());
</code></pre>

<p>控制台输出：</p>

<pre><code class="language-java">包名：com.linxianqin.reflection
完整类名：com.linxianqin.reflection.Person
</code></pre>

<h4 id="2-验证所有的类都是class类的实例对象">2、验证所有的类都是Class类的实例对象</h4>

<pre><code class="language-java">//定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类
Class&lt;?&gt; clazz1=null;
Class&lt;?&gt; clazz2=null;
//写法一: 可能抛出 ClassNotFoundException [多用这个写法]
clazz1= Class.forName(&quot;com.linxianqin.reflection.Person&quot;);
System.out.println(&quot;包名：&quot;+clazz1.getClass().getPackage().getName());
System.out.println(&quot;完整类名：&quot;+clazz1.getClass().getName());
//写法二：
clazz2=Person.class;
System.out.println(&quot;包名：&quot;+clazz2.getClass().getPackage().getName());
System.out.println(&quot;完整类名：&quot;+clazz2.getClass().getName());
</code></pre>

<p>控制台输入：</p>

<pre><code>包名：java.lang
完整类名：java.lang.Class
包名：java.lang
完整类名：java.lang.Class
</code></pre>

<h4 id="3-通过java反射机制-用class-创建类对象-这也就是反射存在的意义所在">3、通过Java反射机制，用Class 创建类对象[这也就是反射存在的意义所在]</h4>

<pre><code class="language-java">Class&lt;?&gt; clazz1= null;
clazz1=Class.forName(&quot;com.linxianqin.reflection.Person&quot;);
//由于这里不能带参数，所以你要实例化的这个类Person，一定要有无参构造函数哈
//如果带参数，有另外的方法来实例化这个Person
Person person = (Person) clazz1.newInstance();
person.setAge(18);
person.setName(&quot;林贤钦&quot;);
System.out.println(person.getName()+&quot;永远&quot;+person.getAge()+&quot;岁&quot;);
</code></pre>

<p>控制台输出：</p>

<pre><code>林贤钦永远18岁
</code></pre>

<h4 id="4-通过java反射机制得到一个类的构造函数-并实现创建带参实例对象">4、通过Java反射机制得到一个类的构造函数，并实现创建带参实例对象</h4>

<pre><code class="language-java">Class&lt;?&gt; clazz1= null;
Person person1=null;
Person person2=null;
clazz1=Class.forName(&quot;com.linxianqin.reflection.Person&quot;);
//得到一系列构造函数集合
Constructor&lt;?&gt;[] constructors = clazz1.getConstructors();
person1 =(Person) constructors[0].newInstance();//这里的constructors[0] 就是我们person类中的第一个无参构造方法
person1.setAge(18);
person1.setName(&quot;林贤钦&quot;);
//这里的constructors[1] 就是我们person类中的第二个构造方法带参数
person2=(Person) constructors[1].newInstance(20,&quot;linxianqin&quot;);
System.out.println(person1.getName() + &quot; : &quot; + person1.getAge()
        + &quot;  ,   &quot; + person2.getName() + &quot; : &quot; + person2.getAge()
);
</code></pre>

<p>控制台输出：</p>

<pre><code>林贤钦 : 18  ,   linxianqin : 20
</code></pre>

<h4 id="5-通过java反射机制操作成员变量-set-和-get">5、通过Java反射机制操作成员变量, set 和 get</h4>

<pre><code class="language-java">Class&lt;?&gt; clazz1 = null;
clazz1 = Class.forName(&quot;com.linxianqin.reflection.Person&quot;);
Object obj = clazz1.newInstance();
Field personNameField  = clazz1.getDeclaredField(&quot;name&quot;);
personNameField.setAccessible(true);
personNameField.set(obj,&quot;林贤钦&quot;);
System.out.println(&quot;Demo5: 修改属性之后得到属性变量的值：&quot; + personNameField.get(obj));
</code></pre>

<p>控制台输出：</p>

<pre><code>Demo5: 修改属性之后得到属性变量的值：林贤钦
</code></pre>

<h4 id="6-通过java反射机制得到类的一些属性-继承的接口-父类-函数信息-成员信息-类型等">6、通过Java反射机制得到类的一些属性： 继承的接口，父类，函数信息，成员信息，类型等</h4>

<p><strong>6.1  创建ActionInterface接口</strong></p>

<pre><code class="language-java">public interface ActionInterface {
    public void walk(int m);
}
</code></pre>

<p><strong>6.2、创建SuperMan类集成Person和实现ActionInterface接口</strong></p>

<pre><code class="language-java">package com.linxianqin.reflection;
public class SuperMan extends Person implements ActionInterface {
    private boolean BlueBriefs;

    public void fly() {
        System.out.println(&quot;超人会飞耶～～&quot;);
    }

    public boolean isBlueBriefs() {
        return BlueBriefs;
    }

    public void setBlueBriefs(boolean blueBriefs) {
        BlueBriefs = blueBriefs;
    }

    @Override
    public void walk(int m) {
        // TODO Auto-generated method stub
        System.out.println(&quot;超人会走耶～～走了&quot; + m + &quot;米就走不动了！&quot;);
    }
}
</code></pre>

<p>6.3 接着玩</p>

<pre><code class="language-java">Class&lt;?&gt; clazz1= null;
clazz1=  Class.forName(&quot;com.linxianqin.reflection.SuperMan&quot;);
//取得父类的名称
Class&lt;?&gt; superClass=clazz1.getSuperclass();
System.out.println(&quot;SuperMan的父类名称：&quot;+superClass.getName());

System.out.println(&quot;===============================================&quot;);
Field[] fields = clazz1.getDeclaredFields();//获取所有的成员变量
//然后我们可以打印一波
for (int i = 0; i &lt; fields.length; i++) {
    System.out.println(&quot;SuperMan类中的成员&quot;+fields[i]);
}
//取得类方法
Method[] methods = clazz1.getDeclaredMethods();
for (int i = 0; i &lt; methods.length; i++) {
    System.out.println(&quot;Demo6,取得SuperMan类的方法：&quot;);
    System.out.println(&quot;函数名：&quot; + methods[i].getName());
    System.out.println(&quot;函数返回类型：&quot; + methods[i].getReturnType());
    System.out.println(&quot;函数访问修饰符：&quot; + Modifier.toString(methods[i].getModifiers()));
    System.out.println(&quot;函数代码写法： &quot; + methods[i]);
}

System.out.println(&quot;===============================================&quot;);
//取得类实现的接口，因为接口类也属于Class ,所以接口中的方法也是一样的
Class&lt;?&gt; interfaces[]=clazz1.getInterfaces();
for (int i = 0; i &lt;interfaces.length ; i++) {
    System.out.println(&quot;实现的接口类名：&quot;+interfaces[i].getName());
}
</code></pre>

<p>控制台输出：</p>

<pre><code>SuperMan的父类名称：com.linxianqin.reflection.Person
===============================================
SuperMan类中的成员private boolean com.linxianqin.reflection.SuperMan.BlueBriefs
取得SuperMan类的方法：
函数名：fly
函数返回类型：void
函数访问修饰符：public
函数代码写法： public void com.linxianqin.reflection.SuperMan.fly()
取得SuperMan类的方法：
函数名：isBlueBriefs
函数返回类型：boolean
函数访问修饰符：public
函数代码写法： public boolean com.linxianqin.reflection.SuperMan.isBlueBriefs()
取得SuperMan类的方法：
函数名：walk
函数返回类型：void
函数访问修饰符：public
函数代码写法： public void com.linxianqin.reflection.SuperMan.walk(int)
取得SuperMan类的方法：
函数名：setBlueBriefs
函数返回类型：void
函数访问修饰符：public
函数代码写法： public void com.linxianqin.reflection.SuperMan.setBlueBriefs(boolean)
===============================================
实现的接口类名：com.linxianqin.reflection.ActionInterface
</code></pre>

<h4 id="7-通过java反射机制调用类方法">7、通过Java反射机制调用类方法</h4>

<pre><code class="language-java">Class&lt;?&gt; class1 = null;
class1 = Class.forName(&quot;com.linxianqin.reflection.SuperMan&quot;);

System.out.println(&quot;Demo7: \n调用无参方法fly()：&quot;);
Method method = class1.getMethod(&quot;fly&quot;);
method.invoke(class1.newInstance());

System.out.println(&quot;调用有参方法walk(int m)：&quot;);
method = class1.getMethod(&quot;walk&quot;,int.class);
method.invoke(class1.newInstance(),100);
</code></pre>

<p>控制台输出：</p>

<pre><code>Demo7: 
调用无参方法fly()：
超人会飞耶～～
调用有参方法walk(int m)：
超人会走耶～～走了100米就走不动了！
</code></pre>

<p>8、通过Java反射机制得到类加载器信息</p>

<pre><code class="language-java">Class&lt;?&gt; class1 = null;
class1 = Class.forName(&quot;com.linxianqin.reflection.SuperMan&quot;);
String nameString = class1.getClassLoader().getClass().getName();
System.out.println(&quot;Demo8: 类加载器类名: &quot; + nameString);
</code></pre>

<p>控制台输出：</p>

<pre><code>Demo8: 类加载器类名: sun.misc.Launcher$AppClassLoader
</code></pre>

<h2 id="反射机制的相关类">反射机制的相关类</h2>

<p>这些是我从网上找来的，其实直接看jdk源码中的Class类就可以了，jdk源码写的也很详细</p>

<p>与Java反射相关的类如下：</p>

<table>
<thead>
<tr>
<th>类名</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>Class类</td>
<td>代表类的实体，在运行的Java应用程序中表示类和接口</td>
</tr>

<tr>
<td>Field类</td>
<td>代表类的成员变量（成员变量也称为类的属性）</td>
</tr>

<tr>
<td>Method类</td>
<td>代表类的方法</td>
</tr>

<tr>
<td>Constructor类</td>
<td>代表类的构造方法</td>
</tr>
</tbody>
</table>

<h2 id="class类">Class类</h2>

<p><a href="https://developer.android.google.cn/reference/java/lang/Class">Class</a>代表类的实体，在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法，这里对他们简单的分类介绍。</p>

<ul>
<li><strong>获得类相关的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>asSubclass(Class<U> clazz)</td>
<td>把传递的类的对象转换成代表其子类的对象</td>
</tr>

<tr>
<td>Cast</td>
<td>把对象转换成代表类或是接口的对象</td>
</tr>

<tr>
<td>getClassLoader()</td>
<td>获得类的加载器</td>
</tr>

<tr>
<td>getClasses()</td>
<td>返回一个数组，数组中包含该类中所有公共类和接口类的对象</td>
</tr>

<tr>
<td>getDeclaredClasses()</td>
<td>返回一个数组，数组中包含该类中所有类和接口类的对象</td>
</tr>

<tr>
<td>forName(String className)</td>
<td>根据类名返回类的对象</td>
</tr>

<tr>
<td>getName()</td>
<td>获得类的完整路径名字</td>
</tr>

<tr>
<td>newInstance()</td>
<td>创建类的实例</td>
</tr>

<tr>
<td>getPackage()</td>
<td>获得类的包</td>
</tr>

<tr>
<td>getSimpleName()</td>
<td>获得类的名字</td>
</tr>

<tr>
<td>getSuperclass()</td>
<td>获得当前类继承的父类的名字</td>
</tr>

<tr>
<td>getInterfaces()</td>
<td>获得当前类实现的类或是接口</td>
</tr>
</tbody>
</table>

<ul>
<li><strong>获得类中属性相关的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>getField(String name)</td>
<td>获得某个公有的属性对象</td>
</tr>

<tr>
<td>getFields()</td>
<td>获得所有公有的属性对象</td>
</tr>

<tr>
<td>getDeclaredField(String name)</td>
<td>获得某个属性对象</td>
</tr>

<tr>
<td>getDeclaredFields()</td>
<td>获得所有属性对象</td>
</tr>
</tbody>
</table>

<ul>
<li><strong>获得类中注解相关的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>getAnnotation(Class<A> annotationClass)</td>
<td>返回该类中与参数类型匹配的公有注解对象</td>
</tr>

<tr>
<td>getAnnotations()</td>
<td>返回该类所有的公有注解对象</td>
</tr>

<tr>
<td>getDeclaredAnnotation(Class<A> annotationClass)</td>
<td>返回该类中与参数类型匹配的所有注解对象</td>
</tr>

<tr>
<td>getDeclaredAnnotations()</td>
<td>返回该类所有的注解对象</td>
</tr>
</tbody>
</table>

<ul>
<li><strong>获得类中构造器相关的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>getConstructor(Class&hellip;&lt;?&gt; parameterTypes)</td>
<td>获得该类中与参数类型匹配的公有构造方法</td>
</tr>

<tr>
<td>getConstructors()</td>
<td>获得该类的所有公有构造方法</td>
</tr>

<tr>
<td>getDeclaredConstructor(Class&hellip;&lt;?&gt; parameterTypes)</td>
<td>获得该类中与参数类型匹配的构造方法</td>
</tr>

<tr>
<td>getDeclaredConstructors()</td>
<td>获得该类所有构造方法</td>
</tr>
</tbody>
</table>

<ul>
<li><strong>获得类中方法相关的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>getMethod(String name, Class&hellip;&lt;?&gt; parameterTypes)</td>
<td>获得该类某个公有的方法</td>
</tr>

<tr>
<td>getMethods()</td>
<td>获得该类所有公有的方法</td>
</tr>

<tr>
<td>getDeclaredMethod(String name, Class&hellip;&lt;?&gt; parameterTypes)</td>
<td>获得该类某个方法</td>
</tr>

<tr>
<td>getDeclaredMethods()</td>
<td>获得该类所有方法</td>
</tr>
</tbody>
</table>

<ul>
<li><strong>类中其他重要的方法</strong></li>
</ul>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>isAnnotation()</td>
<td>如果是注解类型则返回true</td>
</tr>

<tr>
<td>isAnnotationPresent(Class&lt;? extends Annotation&gt; annotationClass)</td>
<td>如果是指定类型注解类型则返回true</td>
</tr>

<tr>
<td>isAnonymousClass()</td>
<td>如果是匿名类则返回true</td>
</tr>

<tr>
<td>isArray()</td>
<td>如果是一个数组类则返回true</td>
</tr>

<tr>
<td>isEnum()</td>
<td>如果是枚举类则返回true</td>
</tr>

<tr>
<td>isInstance(Object obj)</td>
<td>如果obj是该类的实例则返回true</td>
</tr>

<tr>
<td>isInterface()</td>
<td>如果是接口类则返回true</td>
</tr>

<tr>
<td>isLocalClass()</td>
<td>如果是局部类则返回true</td>
</tr>

<tr>
<td>isMemberClass()</td>
<td>如果是内部类则返回true</td>
</tr>
</tbody>
</table>

<h1 id="field类">Field类</h1>

<p><a href="https://developer.android.google.cn/reference/java/lang/reflect/Field">Field</a>代表类的成员变量（成员变量也称为类的属性）。</p>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>equals(Object obj)</td>
<td>属性与obj相等则返回true</td>
</tr>

<tr>
<td>get(Object obj)</td>
<td>获得obj中对应的属性值</td>
</tr>

<tr>
<td>set(Object obj, Object value)</td>
<td>设置obj中对应属性值</td>
</tr>
</tbody>
</table>

<h1 id="method类">Method类</h1>

<p><a href="https://developer.android.google.cn/reference/java/lang/reflect/Method">Method</a>代表类的方法。</p>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>invoke(Object obj, Object&hellip; args)</td>
<td>传递object对象及参数调用该对象对应的方法</td>
</tr>
</tbody>
</table>

<h1 id="constructor类">Constructor类</h1>

<p><a href="https://developer.android.google.cn/reference/java/lang/reflect/Constructor">Constructor</a>代表类的构造方法。</p>

<table>
<thead>
<tr>
<th>方法</th>
<th>用途</th>
</tr>
</thead>

<tbody>
<tr>
<td>newInstance(Object&hellip; initargs)</td>
<td>根据传递的参数创建类的对象</td>
</tr>
</tbody>
</table>

<h2 id="参考文献">参考文献</h2>

<p><a href="https://www.jianshu.com/p/9be58ee20dee">Java高级特性——反射</a></p>

                        </div>
						 
                        
<div class="post-archive">
    <ul class="post-copyright">
        <li><strong>原文作者：</strong><a rel="author" href="http://linxianqin.gitee.io">林贤钦</a></li>
        <li style="word-break:break-all"><strong>原文链接：</strong><a href="http://linxianqin.gitee.io/post/java-%E5%8F%8D%E5%B0%84/">http://linxianqin.gitee.io/post/java-%E5%8F%8D%E5%B0%84/</a></li>
        <li><strong>版权声明：</strong>本作品采用<a rel="license" href="https://linxianqin.gitee.io">知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议</a>进行许可，非商业转载请注明出处（作者，原文链接），商业转载请联系作者获得授权。</li>
    </ul>
</div>
<br/>



                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/post/java-%E9%93%BE%E8%A1%A8/">Java 链表</a></li>
        
        <li><a href="/post/java8%E6%96%B0%E7%89%B9%E6%80%A7Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/">Java8新特性Lambda表达式</a></li>
        
        <li><a href="/post/java8%E6%96%B0%E7%89%B9%E6%80%A7stream%E6%B5%81/">Java8新特性stream流</a></li>
        
        <li><a href="/post/%E7%9F%AD%E4%BF%A1%E6%B3%A8%E5%86%8C%E5%92%8C%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95%E7%9A%84%E5%AE%9E%E7%8E%B0/">短信注册和微信登录的实现</a></li>
        
        <li><a href="/post/OAuth2.0%E8%AE%A4%E8%AF%81%E6%8E%88%E6%9D%83%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95/">OAuth2.0认证授权单点登录</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="http://linxianqin.gitee.io/tags/java8">java8</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
    <div class="post bg-white">
      <script src="https://utteranc.es/client.js"
            repo= "757610938/hugo-blogs-utterances"
            issue-term="pathname"
            theme="github-light"
            crossorigin="anonymous"
            async>
      </script>
    </div>
    
                </div>
            </div>
            <div id="secondary">
    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="http://linxianqin.gitee.io">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>
    
    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://linxianqin.gitee.io/post/java-%E5%8F%8D%E5%B0%84/" title="Java 反射">Java 反射</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/java-%E9%93%BE%E8%A1%A8/" title="Java 链表">Java 链表</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E7%9F%AD%E4%BF%A1%E6%B3%A8%E5%86%8C%E5%92%8C%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95%E7%9A%84%E5%AE%9E%E7%8E%B0/" title="短信注册和微信登录的实现">短信注册和微信登录的实现</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/OAuth2.0%E8%AE%A4%E8%AF%81%E6%8E%88%E6%9D%83%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95/" title="OAuth2.0认证授权单点登录">OAuth2.0认证授权单点登录</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/Nacos%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/" title="Nacos服务注册中心">Nacos服务注册中心</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1/" title="SpringCloud微服务">SpringCloud微服务</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%BF%E9%87%8C%E4%BA%91%E8%A7%86%E9%A2%91%E7%82%B9%E6%92%AD%E6%9C%8D%E5%8A%A1/" title="阿里云视频点播服务前后端实现">阿里云视频点播服务前后端实现</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%9F%E5%88%97/" title="队列">队列</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E7%A8%80%E7%96%8F%E6%95%B0%E7%BB%84/" title="稀疏数组">稀疏数组</a>
    </li>
    
    <li>
        <a href="http://linxianqin.gitee.io/post/%E9%98%BF%E9%87%8C%E4%BA%91EasyExcel%E5%AE%9E%E7%8E%B0%E5%90%8E%E7%AB%AF%E5%AF%B9Excel%E7%9A%84%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C/" title="使用阿里云EasyExcel实现后端对Excel的读写操作">使用阿里云EasyExcel实现后端对Excel的读写操作</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li><a href="http://linxianqin.gitee.io/categories/JWT/">JWT (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/hugo/">hugo (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/java/">java (18)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/java8/">java8 (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/springCloud/">springCloud (2)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/springSecurity/">springSecurity (4)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/vue/">vue (5)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/yml/">yml (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构 (3)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/">软件测试 (1)</a></li>
    
    <li><a href="http://linxianqin.gitee.io/categories/%E9%98%BF%E9%87%8C%E4%BA%91/">阿里云 (4)</a></li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="http://linxianqin.gitee.io/tags/JWT/">JWT</a>
    
    <a href="http://linxianqin.gitee.io/tags/hugo/">hugo</a>
    
    <a href="http://linxianqin.gitee.io/tags/java/">java</a>
    
    <a href="http://linxianqin.gitee.io/tags/java8/">java8</a>
    
    <a href="http://linxianqin.gitee.io/tags/spring/">spring</a>
    
    <a href="http://linxianqin.gitee.io/tags/springBoot/">springBoot</a>
    
    <a href="http://linxianqin.gitee.io/tags/springCloud/">springCloud</a>
    
    <a href="http://linxianqin.gitee.io/tags/ssm/">ssm</a>
    
    <a href="http://linxianqin.gitee.io/tags/vue/">vue</a>
    
    <a href="http://linxianqin.gitee.io/tags/yml/">yml</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/">软件测试</a>
    
    <a href="http://linxianqin.gitee.io/tags/%E9%98%BF%E9%87%8C%E4%BA%91/">阿里云</a>
    
</div>
    </section>

    
<section class="widget">
    <h3 class="widget-title">友情链接</h3>
    <ul class="widget-list">
        
        <li>
            <a target="_blank" href="https://www.cnki.net" title="中国知网">中国知网</a>
        </li>
        
        <li>
            <a target="_blank" href="https://linxianqin.com" title="个人的另一个博客网站(国内加载慢)">个人的另一个博客网站(国内加载慢)</a>
        </li>
        
    </ul>
</section>


    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="http://linxianqin.gitee.io/index.xml">文章 RSS</a></li>
        </ul>
    </section>
</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="http://linxianqin.gitee.io">林贤钦 By 林贤钦</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/rujews/maupassant-hugo" target="_blank">maupassant</a>.
        
    </div>
</footer>


    
    <script type="text/javascript">
        
        (function () {
            $("pre code").parent().addClass("line-numbers")
        }());

        window.MathJax = {
            tex2jax: {
                inlineMath: [['$', '$']],
                processEscapes: true
                }
            };
    </script>
    <script type="text/javascript" src="/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>


<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/js/totop.js?v=0.0.0" async=""></script>

<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'GA ID', 'auto');
	
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>



    <script type="text/javascript" src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script>




</body>
</html>
